package com.fcfactory.eggutils.dbUtils;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.fcfactory.eggutils.dbUtils.dto.GenerationCodeParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
 * @autuor 范大晨
 * @Date 2023/9/19 16:37
 * @description 连接数据库生成实体类，mapper，service，controller
 * 使用mybatisplus 封装后使用更简单
 */
@Component
public class CodeGenerationUtil {
    @Autowired
    private AutoGenerator mpg; //代码生成器
    @Autowired
    private GlobalConfig gc;//全局配置
    @Autowired
    private DataSourceConfig dsc;//数据源配置
    @Autowired
    private PackageConfig pc;//包配置
    @Autowired
    private StrategyConfig strategy;//策略配置

    public void generationCode(GenerationCodeParam generationCodeParam) {
        gc.setOutputDir(generationCodeParam.getOutputDir());         //输出目录
        gc.setServiceName("%sService");    //去掉Service接口的首字母I
        gc.setAuthor(generationCodeParam.getAuthor());              //设置生成文件的作者信息
        gc.setOpen(false);                //设置代码生成完成后是否打开输出目录
        mpg.setGlobalConfig(gc);          //将配置好的GlobalConfig对象gc设置到代码生成器mpg中

        dsc.setUrl(generationCodeParam.getUrl());                 //设置数据源的URL
        dsc.setDriverName(generationCodeParam.getDriverName());  //设置数据库驱动程序的名称
        dsc.setUsername(generationCodeParam.getUserName());      //设置数据库的用户名
        dsc.setPassword(generationCodeParam.getPassWord());      //设置数据库的密码
        dsc.setDbType(generationCodeParam.getDbType());          //设置数据库类型
        mpg.setDataSource(dsc);         //将配置好的DataSourceConfig对象dsc设置到代码生成器mpg中

        pc.setParent(generationCodeParam.getParentPackage());    //设置包的父路径
        pc.setEntity("dao");            //设置实体类所在的包名
        pc.setModuleName(generationCodeParam.getModuleName());   //模块名
        pc.setController("controller"); //设置Controller层所在的包名
        pc.setService("service");       //设置Service层所在的包名
        pc.setMapper("mapper");         //设置Mapper层所在的包名
        mpg.setPackageInfo(pc);         //将配置好的PackageConfig对象pc设置到代码生成器mpg中

        strategy.setInclude(String.join(",", generationCodeParam.getTableNames()));       //设置要进行代码生成的表名
        strategy.setNaming(NamingStrategy.underline_to_camel);//设置数据库表映射到实体的命名策略 这里将下划线命名方式转化为驼峰命名方式
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//设置数据库表字段映射到实体的命名策略。这里将下划线命名方式转化为驼峰命名方式
        strategy.setEntityLombokModel(generationCodeParam.getIfLombook());         // 设置是否使用Lombok模型。这里设置为true，即使用Lombok注解来简化实体类的编写，例如使用@Data注解自动生成Getter/Setter方法
        strategy.setRestControllerStyle(generationCodeParam.getIfRestful());      //设置Controller层是否使用Restful API风格
        strategy.setControllerMappingHyphenStyle(generationCodeParam.getIfHyphen()); //设置Controller层的URL路径是否使用连字符风格。http://example.com/user-info 其中，"user-info"就是使用了连字符风格的路径
        mpg.setStrategy(strategy);                  //将配置好的StrategyConfig对象strategy设置到代码生成器mpg中

        mpg.execute();
    }
}
